//给你一个正整数数组 nums ，请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。 
//
// 返回 只删除一个 子数组可获得的 最大得分 。 
//
// 如果数组 b 是数组 a 的一个连续子序列，即如果它等于 a[l],a[l+1],...,a[r] ，那么它就是 a 的一个子数组。 
//
// 
//
// 示例 1： 
//
// 
//输入：nums = [4,2,4,5,6]
//输出：17
//解释：最优子数组是 [2,4,5,6]
// 
//
// 示例 2： 
//
// 
//输入：nums = [5,2,1,2,5,2,1,2,5]
//输出：8
//解释：最优子数组是 [5,2,1] 或 [1,2,5]
// 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 10⁵ 
// 1 <= nums[i] <= 10⁴ 
// 
//
// Related Topics 数组 哈希表 滑动窗口 👍 129 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
	public int maximumUniqueSubarray(int[] nums) {
		//  滑动窗口,right从左往右滑动，用set来存储已有的内容，当set中已经包含的时候，
		//  left从左往后再次滑动，滑动到right表示的元素去掉后，right继续向右滑动
		int right = 0;
		int left = 0;
		Set<Integer> set = new HashSet<>();
		int max = 0;
		int cnt = 0;
		for (int i = 0; i < nums.length; i++) {
			int num = nums[i];
			//  right往右移动
			if (set.add(num)) {
				// 	如果没有当前的值就直接添加往右移动
				cnt += num;
				right++;
			} else {
				// 	如果包含有
				while (nums[left] != num) {
					// 如果有那么从left开始移除，直到 nums[left] == num
					set.remove(nums[left]);
					cnt -= nums[left];
					left++;
				}
				// 	因为只到 nums[left] == num 所以需要在移除 一次
				set.remove(nums[left]);
				cnt -= nums[left];
				left++;
				// 	再添加一次
				i--;
			}
			max = Math.max(max, cnt);
		}
		return max;
		
	}
}
//leetcode submit region end(Prohibit modification and deletion)
